<?php

declare(strict_types=1);

namespace app\api\controller;

use app\common\model\Goods;
use app\common\model\GoodsList;
use app\common\model\Order;
use app\common\model\OrderList;
use app\common\model\OrderListRecovery;
use app\common\model\OrderListSend;
use app\common\model\Shang;
use app\common\model\User;
use think\facade\Db;
use think\Request;

class Warehouse extends Base
{
    /**
     * 赏袋列表
     * @param $type 1赏品 2预售 3卡册 4保险柜
     */
    public function warehouse_index()
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        #自动变现货=========================
        // OrderList::field("goodslist_type")
        //     ->where('user_id', '=', $user_id)
        //     ->where('status', '=', 0)
        //     ->where('goodslist_type', '=', 2)
        //     ->where('goodslist_sale_time', '<=', time())
        //     ->update(['goodslist_type' => 1]);
        $linqi_list = OrderList::field("goodslist_type,goodslist_id,user_id,id")
            ->where('user_id', '=', $user_id)
            ->where('status', '=', 0)
            ->where('goodslist_type', '=', 2)
            ->select()->toArray();
        foreach ($linqi_list as $k => $val) {
            $sale_time = GoodsList::where(['id' => $val['goodslist_id']])->value('sale_time');
            if (!empty($sale_time)) {
                if ($sale_time <= time()) {
                    OrderList::where(['id' => $val['id'], 'status' => 0, 'user_id' => $val['user_id'], 'goodslist_type' => 2])->update(['goodslist_type' => 1]);
                }
            } else {
                OrderList::where(['id' => $val['id'], 'status' => 0, 'user_id' => $val['user_id'], 'goodslist_type' => 2])->where('goodslist_sale_time', '<=', time())->update(['goodslist_type' => 1]);
            }
        }

        #自动变现货=========================

        $type = request()->param('type/d', 0);

        // $type = 3;
        if ($type == 1) { #赏品
            $keyword = request()->param('keyword', '');
            #搜索
            $whe = [];
            if ($keyword) {
                $whe[] = ['goodslist_title', 'like', '%' . $keyword . '%'];
            }
            #总数量
            $total = 0;
            #找到所在盒子
            $data = OrderList::field('goods_id')
                ->append(['goods_title'])
                ->withAttr('goods_title', function ($value, $data) {
                    if ($data['goods_id'] == 0) {
                        $title = '无限令奖品';
                    } elseif ($data['goods_id'] == -1) {
                        $title = '周榜奖品';
                    } elseif ($data['goods_id'] == -1) {
                        $title = '月榜奖品';
                    } else {
                        $title = Db::name('goods')->field('title')->where('id', '=', $data['goods_id'])->value('title');
                    }
                    return $title ? $title : '其他';
                })
                ->where('user_id', '=', $user_id)
                ->where('status', '=', 0)
                ->where('goodslist_type', '=', 1)
                ->where('insurance_is', '=', 0)
                ->where('order_type', 'not in', [4])
                ->group("goods_id")
                ->order('goods_id asc')
                ->select()->toArray();
            foreach ($data as &$data_value) {
                $orderlist = OrderList::field("id,goodslist_title,goodslist_imgurl,goodslist_money,goods_id,shang_id,prize_code,count(id) as prize_num")
                    ->append(['shang_title'])
                    ->where('goods_id', '=', $data_value['goods_id'])
                    ->where('user_id', '=', $user_id)
                    ->where('status', '=', 0)
                    ->where('goodslist_type', '=', 1)
                    ->where('insurance_is', '=', 0)
                    ->where('order_type', 'not in', [4])
                    ->where($whe)
                    ->order('shang_id asc, goodslist_money desc')
                    ->withAttr('goodslist_imgurl', function ($value, $data) {
                        return imageUrl($value);
                    })
                    ->withAttr('goodslist_money', function ($value, $data) {
                        return (float) $value;
                    })
                    ->group("prize_code")
                    ->select()->toArray();
                foreach ($orderlist as $k => &$v) {
                    $v['order_list_ids'] = OrderList::where('goods_id', '=', $v['goods_id'])
                        ->where('user_id', '=', $user_id)
                        ->where('status', '=', 0)
                        ->where('goodslist_type', '=', 1)
                        ->where('insurance_is', '=', 0)
                        ->where('order_type', 'not in', [4, 9])
                        ->where('prize_code', '=', $v['prize_code'])
                        ->order('shang_id asc')
                        ->column('id');
                }
                $orderlist_total = array_sum(array_column($orderlist, 'prize_num'));
                $total += $orderlist_total;
                $data_value['orderlist'] = $orderlist;
                $data_value['orderlist_total'] = $orderlist_total;
                $data_value['orderlist_length'] = count($orderlist);
            }
        } elseif ($type == 2) { #预售
            $keyword = request()->param('keyword', '');
            #搜索
            $whe = [];
            if ($keyword) {
                $whe[] = ['goodslist_title', 'like', '%' . $keyword . '%'];
            }
            #总数量
            $total = 0;
            #找到所在盒子
            $data = OrderList::field('goods_id')
                ->append(['goods_title'])
                ->withAttr('goods_title', function ($value, $data) {
                    $title = Db::name('goods')->field('title')->where('id', '=', $data['goods_id'])->value('title');
                    return $title ? $title : '其他';
                })
                ->where('user_id', '=', $user_id)
                ->where('status', '=', 0)
                ->where('goodslist_type', '=', 2)
                ->where('insurance_is', '=', 0)
                ->where('order_type', 'not in', [4])
                ->group("goods_id")
                ->order('goods_id asc')
                ->select()->toArray();
            foreach ($data as &$data_value) {
                $orderlist = OrderList::field("goodslist_title,goodslist_imgurl,goodslist_money,goods_id,shang_id,prize_code,goodslist_sale_time,count(id) as prize_num")
                    ->append(['shang_title'])
                    ->where('goods_id', '=', $data_value['goods_id'])
                    ->where('user_id', '=', $user_id)
                    ->where('status', '=', 0)
                    ->where('goodslist_type', '=', 2)
                    ->where('insurance_is', '=', 0)
                    ->where('order_type', 'not in', [4])
                    ->where($whe)
                    ->order('shang_id asc, goodslist_money desc')
                    ->withAttr('goodslist_imgurl', function ($value, $data) {
                        return imageUrl($value);
                    })
                    ->withAttr('goodslist_money', function ($value, $data) {
                        return (float) $value;
                    })
                    ->withAttr('goodslist_sale_time', function ($value, $data) {
                        return date('Y-m-d', $value);
                    })
                    ->group("prize_code")
                    ->select()->toArray();
                $orderlist_total = array_sum(array_column($orderlist, 'prize_num'));
                $total += $orderlist_total;
                $data_value['orderlist'] = $orderlist;
                $data_value['orderlist_total'] = $orderlist_total;
                $data_value['orderlist_length'] = count($orderlist);
            }
        } elseif ($type == 3) { #卡册
            $keyword = request()->param('keyword', '');
            $category_id = request()->param('category_id/d', 0);
            #搜索
            $whe = [];
            if ($keyword) {
                $whe[] = ['o.goods_title', 'like', '%' . $keyword . '%'];
            }
            if ($category_id) {
                $whe[] = ['g.category_id', $category_id];
            }
            //            dd($whe);
            #卡册列表
            $obj = Order::field('o.id,o.goods_id,o.goods_title,o.goods_imgurl,g.category_id')->alias('o')
                ->join('goods g', 'g.id = o.goods_id')
                ->where('o.user_id', '=', $user_id)
                ->where('o.order_type', '=', 4);
            if ($keyword) {
                $obj->where('o.goods_title', 'like', '%' . $keyword . '%');
            }
            if ($category_id) {
                $obj->where('g.category_id', $category_id);
            }
            $list = $obj->order('o.id desc')
                ->group('o.goods_id')
                ->paginate(30)->each(function ($itme) use ($user_id) {
                    $goods_info = Db::name('goods')->field('title,imgurl')->where('id', '=', $itme['goods_id'])->find();
                    if ($goods_info) {
                        $itme['goods_title'] = $goods_info['title'];
                        $itme['goods_imgurl'] = imageUrl($goods_info['imgurl']);
                    } else {
                        $itme['goods_imgurl'] = imageUrl($itme['goods_imgurl']);
                    }
                    #奖品总量
                    $all_count = GoodsList::field('id')
                        ->where('goods_id', '=', $itme['goods_id'])
                        ->count();
                    #获得数量
                    $buy_count = OrderList::field('id')
                        ->where('user_id', '=', $user_id)
                        ->where('goods_id', '=', $itme['goods_id'])
                        ->where('status', '=', 0)
                        ->group('goodslist_id')
                        ->count();
                    if ($buy_count > 0) {
                        $gailv = (float) bcdiv("$buy_count", "$all_count", 2);
                        $gailv = bcmul("$gailv", "100", 2);
                        $gailv = (float) $gailv;
                    } else {
                        $gailv = 0;
                    }
                    $itme['all_count'] = $all_count;
                    $itme['buy_count'] = $buy_count;
                    $itme['gailv'] = $gailv;
                    return $itme;
                });
            $data = $list->items();
            $last_page = $list->lastPage();
        } elseif ($type == 4) { #保险柜
            $keyword = request()->param('keyword', '');
            #搜索
            $whe = [];
            if ($keyword) {
                $whe[] = ['goodslist_title', 'like', '%' . $keyword . '%'];
            }
            #总数量
            $total = 0;
            #找到所在盒子
            $data = OrderList::field('goods_id')
                ->append(['goods_title'])
                ->withAttr('goods_title', function ($value, $data) {
                    if ($data['goods_id'] == 0) {
                        $title = '无限令奖品';
                    } elseif ($data['goods_id'] == -1) {
                        $title = '周榜奖品';
                    } elseif ($data['goods_id'] == -1) {
                        $title = '月榜奖品';
                    } else {
                        $title = Db::name('goods')->field('title')->where('id', '=', $data['goods_id'])->value('title');
                    }
                    return $title ? $title : '其他';
                })
                ->where('user_id', '=', $user_id)
                ->where('status', '=', 0)
                ->where('insurance_is', '=', 1)
                ->where('order_type', 'not in', [4])
                ->group("goods_id")
                ->order('goods_id asc')
                ->select()->toArray();
            foreach ($data as &$data_value) {
                $orderlist = OrderList::field("goodslist_title,goodslist_imgurl,goodslist_money,goods_id,shang_id,prize_code,count(id) as prize_num")
                    ->append(['shang_title'])
                    ->where('goods_id', '=', $data_value['goods_id'])
                    ->where('user_id', '=', $user_id)
                    ->where('status', '=', 0)
                    ->where('insurance_is', '=', 1)
                    ->where('order_type', 'not in', [4])
                    ->where($whe)
                    ->order('shang_id asc, goodslist_money desc')
                    ->withAttr('goodslist_imgurl', function ($value, $data) {
                        return imageUrl($value);
                    })
                    ->withAttr('goodslist_money', function ($value, $data) {
                        return (float) $value;
                    })
                    ->group("prize_code")
                    ->select()->toArray();
                $orderlist_total = array_sum(array_column($orderlist, 'prize_num'));
                $total += $orderlist_total;
                $data_value['orderlist'] = $orderlist;
                $data_value['orderlist_total'] = $orderlist_total;
                $data_value['orderlist_length'] = count($orderlist);
            }
        } else if ($type == 5) {   //无限赏
            $keyword = request()->param('keyword', '');
            #搜索
            $whe = [];
            if ($keyword) {
                $whe[] = ['goodslist_title', 'like', '%' . $keyword . '%'];
            }
            #总数量
            $total = 0;
            #找到所在盒子
            $data = OrderList::field('goods_id')
                ->append(['goods_title'])
                ->withAttr('goods_title', function ($value, $data) {
                    if ($data['goods_id'] == 0) {
                        $title = '无限令奖品';
                    } elseif ($data['goods_id'] == -1) {
                        $title = '周榜奖品';
                    } elseif ($data['goods_id'] == -1) {
                        $title = '月榜奖品';
                    } else {
                        $title = Db::name('goods')->field('title')->where('id', '=', $data['goods_id'])->value('title');
                    }
                    return $title ? $title : '其他';
                })
                ->where('user_id', '=', $user_id)
                ->where('status', '=', 0)
                ->where('goodslist_type', '=', 1)
                ->where('insurance_is', '=', 0)
                ->where('order_type', '=', 2)
                ->group("goods_id")
                ->order('goods_id asc')
                ->select()->toArray();
            foreach ($data as &$data_value) {
                $orderlist = OrderList::field("id,goodslist_title,goodslist_imgurl,goodslist_money,goods_id,shang_id,prize_code,count(id) as prize_num")
                    ->append(['shang_title'])
                    ->where('goods_id', '=', $data_value['goods_id'])
                    ->where('user_id', '=', $user_id)
                    ->where('status', '=', 0)
                    ->where('goodslist_type', '=', 1)
                    ->where('insurance_is', '=', 0)
                    ->where('order_type', '=', 2)
                    ->where($whe)
                    ->order('shang_id asc. goodslist_money desc')
                    ->withAttr('goodslist_imgurl', function ($value, $data) {
                        return imageUrl($value);
                    })
                    ->withAttr('goodslist_money', function ($value, $data) {
                        return (float) $value;
                    })
                    ->group("prize_code")
                    ->select()->toArray();

                foreach ($orderlist as $k => &$v) {
                    $v['order_list_ids'] = OrderList::where('goods_id', '=', $v['goods_id'])
                        ->where('user_id', '=', $user_id)
                        ->where('status', '=', 0)
                        ->where('goodslist_type', '=', 1)
                        ->where('insurance_is', '=', 0)
                        ->where('order_type', '=', 2)
                        ->where('prize_code', '=', $v['prize_code'])
                        ->order('shang_id asc')
                        ->column('id');
                }

                $orderlist_total = array_sum(array_column($orderlist, 'prize_num'));
                $total += $orderlist_total;
                $data_value['orderlist'] = $orderlist;
                $data_value['orderlist_total'] = $orderlist_total;
                $data_value['orderlist_length'] = count($orderlist);
            }
        } else {
            return $this->renderError("请求错误");
        }
        #运费设置
        $config = getConfig("base");
        $yufei = [
            'free_post' => $config['free_post'],
            'post_money' => $config['post_money'],
        ];
        $new_data = [
            'total' => isset($total) ? $total : 0,
            'data' => $data,
            'last_page' => isset($last_page) ? $last_page : 1,
            'yufei' => $yufei,
        ];
        return $this->renderSuccess("请求成功", $new_data);
    }

    /**
     * 卡册详情
     */
    public function warehouse_carddetail_log()
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $keyword = request()->param('keyword', '');
        $type = request()->param('type/d', 0);
        $shang_id = request()->param('shang_id/d', 0);
        $goods_id = request()->param('goods_id/d', 0);
        #详情
        $goods = Order::field('id,goods_id,goods_title,goods_imgurl')
            ->where('user_id', '=', $user_id)
            ->where('goods_id', '=', $goods_id)
            ->where('order_type', '=', 4)
            ->order('id desc')
            ->find();
        $goods_info = Db::name('goods')->field('title,card_banner')->where('id', '=', $goods['goods_id'])->find();
        if ($goods_info) {
            $goods['goods_title'] = $goods_info['title'];
            $goods['goods_imgurl'] = imageUrl($goods_info['card_banner']);
        } else {
            $goods['goods_imgurl'] = imageUrl($goods['goods_imgurl']);
        }
        #全部数量
        $all_count = GoodsList::field('id')->where('goods_id', '=', $goods_id)->count();
        #获得数量
        $buy_count = OrderList::field('id')
            ->where('user_id', '=', $user_id)
            ->where('goods_id', '=', $goods_id)
            ->where('status', '=', 0)
            ->group('goodslist_id')
            ->count();
        if ($buy_count > 0) {
            $gailv = (float) bcdiv("$buy_count", "$all_count", 2);
            $gailv = bcmul("$gailv", "100", 2);
            $gailv = (float) $gailv;
        } else {
            $gailv = 0;
        }
        $goods['all_count'] = $all_count;
        $goods['buy_count'] = $buy_count;
        $goods['gailv'] = $gailv;
        #奖品分类
        $category = Shang::field('id,title')
            ->where('goods_id', '=', $goods_id)
            ->order('sort desc,id asc')
            ->select()->toArray();
        $where = [];
        $where_order = [];
        if ($shang_id) {
            $where[] = ['shang_id', '=', $shang_id];
            $where_order[] = ['shang_id', '=', $shang_id];
        }
        if ($type == 0) { #全部
            #搜索
            if ($keyword) {
                $where[] = ['title', 'like', '%' . $keyword . '%'];
            }
            #奖品
            $data = GoodsList::field('id,title as goodslist_title,imgurl as goodslist_imgurl,money as goodslist_money,goods_id,shang_id,prize_code,card_no,shang_id')
                ->append(['shang_title'])
                ->where('goods_id', '=', $goods_id)
                ->where($where)
                ->order('sort desc,id asc')
                ->paginate(15);
            $goodslist = $data->toArray()['data'];
            $last_page = $data->lastPage();
            foreach ($goodslist as $key => $value) {
                unset($goodslist[$key]['id']);
                $goodslist[$key]['goodslist_imgurl'] = imageUrl($value['goodslist_imgurl']);
                #是否被抽中
                $is_info = OrderList::field('goodslist_id,goodslist_title,goodslist_imgurl,goodslist_money,goods_id,shang_id,prize_code,count(id) as prize_num,shang_id')
                    ->append(['card_no', 'shang_title'])
                    ->withAttr('goodslist_imgurl', function ($value, $data) {
                        return imageUrl($value);
                    })
                    ->where('user_id', '=', $user_id)
                    ->where('goods_id', '=', $goods_id)
                    ->where('num', '=', 0)
                    ->where('status', '=', 0)
                    ->where('goodslist_id', '=', $value['id'])
                    ->where('insurance_is', '=', 0)
                    ->where($where_order)
                    ->group('prize_code')
                    ->find();
                if ($is_info) {
                    $goodslist[$key] = $is_info;
                    $goodslist[$key]['is'] = 1;
                } else {
                    $goodslist[$key]['is'] = 0;
                    $goodslist[$key]['prize_num'] = 0;
                }
            }
        } elseif ($type == 1) { #已拥有
            #搜索
            if ($keyword) {
                $where[] = ['goodslist_title', 'like', '%' . $keyword . '%'];
            }
            #奖品
            $data = OrderList::field('goodslist_id,goodslist_title,goodslist_imgurl,goodslist_money,goods_id,shang_id,prize_code,count(id) as prize_num,shang_id')
                ->append(['card_no', 'shang_title'])
                ->withAttr('goodslist_imgurl', function ($value, $data) {
                    return imageUrl($value);
                })
                ->where('user_id', '=', $user_id)
                ->where('goods_id', '=', $goods_id)
                ->where('num', '=', 0)
                ->where('status', '=', 0)
                ->where('insurance_is', '=', 0)
                ->where($where)
                ->group('prize_code')
                ->paginate(15);
            $goodslist = $data->toArray()['data'];
            $last_page = $data->lastPage();
            foreach ($goodslist as &$goodslist_value) {
                $goodslist_value['is'] = 1;
            }
        } elseif ($type == 2) { #未拥有
            #搜索
            if ($keyword) {
                $where[] = ['title', 'like', '%' . $keyword . '%'];
            }
            #全部奖品ID
            $goodslist_id = GoodsList::field('id')->where('goods_id', '=', $goods_id)->column('id');
            #中奖奖品id
            $prize_id = OrderList::field('goodslist_id')
                ->where('user_id', '=', $user_id)
                ->where('goods_id', '=', $goods_id)
                ->where('num', '=', 0)
                ->where('status', '=', 0)
                ->where('insurance_is', '=', 0)
                ->group('goodslist_id')
                ->column('goodslist_id');
            $arr_id = array_diff($goodslist_id, $prize_id);
            $where[] = ['id', 'in', $arr_id];
            #奖品
            $data = GoodsList::field('id,title as goodslist_title,imgurl as goodslist_imgurl,money as goodslist_money,goods_id,shang_id,prize_code,card_no,shang_id')
                ->append(['shang_title'])
                ->where('goods_id', '=', $goods_id)
                ->where($where)
                ->order('sort desc,id asc')
                ->paginate(15);
            $goodslist = $data->toArray()['data'];
            $last_page = $data->lastPage();
            foreach ($goodslist as &$value) {
                $value['goodslist_imgurl'] = imageUrl($value['goodslist_imgurl']);
                unset($value['id']);
                $value['is'] = 0;
                $value['prize_num'] = 0;
            }
        } elseif ($type == 3) { #保险柜
            #搜索
            if ($keyword) {
                $where[] = ['goodslist_title', 'like', '%' . $keyword . '%'];
            }
            #奖品
            $data = OrderList::field('goodslist_id,goodslist_title,goodslist_imgurl,goodslist_money,goods_id,shang_id,prize_code,count(id) as prize_num,shang_id')
                ->append(['card_no', 'shang_title'])
                ->withAttr('goodslist_imgurl', function ($value, $data) {
                    return imageUrl($value);
                })
                ->where('user_id', '=', $user_id)
                ->where('goods_id', '=', $goods_id)
                ->where('num', '=', 0)
                ->where('status', '=', 0)
                ->where('insurance_is', '=', 1)
                ->where($where)
                ->group('prize_code')
                ->paginate(15);
            $goodslist = $data->toArray()['data'];
            $last_page = $data->lastPage();
            foreach ($goodslist as &$goodslist_value) {
                $goodslist_value['is'] = 1;
            }
        } else {
            return $this->renderError("请求错误");
        }
        #运费设置
        $config = getConfig("base");
        $yufei = [
            'free_post' => $config['card_free_post'],
            'post_money' => $config['card_post_money'],
        ];
        $new_data = [
            'total' => array_sum(array_column($goodslist, 'prize_num')),
            'goods' => $goods,
            'yufei' => $yufei,
            'category' => $category,
            'goodslist' => $goodslist,
            'last_page' => $last_page,
        ];
        return $this->renderSuccess("请求成功", $new_data);
    }


    /**
     * 兑换
     */
    public function warehouse_recovery()
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $recovery_info = request()->param('recovery_info', '');
        if (empty($recovery_info)) {
            return $this->renderError("请选择退回的赏品");
        }
        #装换结构
        $recovery_info = json_decode($recovery_info, true);
        $order_list_id = [];
        foreach ($recovery_info as $value) {
            $order_list_ids = OrderList::field('id')
                ->where('user_id', '=', $user_id)
                ->where('status', '=', 0)
                ->where('insurance_is', '=', 0)
                ->where('prize_code', '=', $value['prize_code'])
                ->limit(intval($value['number']))
                ->column("id");
            $order_list_id = array_merge($order_list_id, $order_list_ids);
        }
        if (!$order_list_id) {
            return $this->renderError("请刷新重新选择奖品");
        }
        #兑换金额
        $total_money = OrderList::field('goodslist_money')
            ->where('id', 'in', $order_list_id)
            ->where('user_id', '=', $user_id)
            ->where('status', '=', 0)
            ->where('insurance_is', '=', 0)
            ->sum("goodslist_money");
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis_key = "kpw_warehouse_recovery" . '_' . $user['id'];
        $redis_key_info = $redis->get($redis_key);
        if ($redis_key_info) {
            return $this->renderError("当前操作太快了,请等待");
        } else {
            $redis->set($redis_key, 1, 10);
        }
        #兑换单号
        $recovery_num = create_order_no('HS_', 'order_list_recovery', 'recovery_num');
        Db::startTrans();
        $res = [];
        #记录日志
        $res[] = OrderListRecovery::insert([
            'user_id' => $user_id,
            'recovery_num' => $recovery_num,
            'money' => $total_money,
            'count' => count($order_list_id),
            'addtime' => time(),
        ]);
        #改变状态
        $res[] = OrderList::field('recovery_num,status,choice_time')
            ->where('id', 'in', $order_list_id)
            ->where('user_id', '=', $user_id)
            ->where('status', '=', 0)
            ->where('insurance_is', '=', 0)
            ->update([
                'recovery_num' => $recovery_num,
                'status' => 1,
                'choice_time' => time(),
            ]);
        #兑换金额
        if ($total_money > 0) {
            // $res[] = User::changeIntegral($user_id, $total_money, 6, '背包退回获得');

            $res[] = User::changeMoney($user_id, $total_money, 4, '背包回收');
        }
        if (resCheck($res)) {
            Db::commit();
            #删除redis
            $redis->del($redis_key);
            return $this->renderSuccess("打包成功");
        } else {
            Db::rollback();
            #删除redis
            $redis->del($redis_key);
            return $this->renderError("打包失败");
        }
    }

    /**
     * 发货
     */
    public function warehouse_send(Request $request)
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $type = request()->param('type/d', 0);
        #背包  抽卡机
        if ($type != 1 && $type != 2) {
            return $this->renderError("请求参数错误");
        }
        $recovery_info = request()->param('recovery_info', '');
        if (empty($recovery_info)) {
            return $this->renderError("请选择兑换的赏品");
        }
        $name = request()->param("name", '');
        $mobile = request()->param("mobile", '');
        $address = request()->param("address", '');
        $message = request()->param("message", '');
        $pay_way = request()->param('pay_way');  //支付
        if (empty($name) || empty($mobile) || empty($address)) {
            return $this->renderError("缺少收货信息");
        }
        #装换结构
        $recovery_info = json_decode($recovery_info, true);
        $order_list_id = [];
        foreach ($recovery_info as $value) {
            $order_list_ids = OrderList::field('id')
                ->where('user_id', '=', $user_id)
                ->where('status', '=', 0)
                ->where('insurance_is', '=', 0)
                ->where('goodslist_type', '=', 1)
                ->where('prize_code', '=', trim($value['prize_code']))
                ->limit($value['number'])
                ->column("id");
            $order_list_id = array_merge($order_list_id, $order_list_ids);
        }
        if (!$order_list_id) {
            return $this->renderError("请刷新重新选择奖品");
        }
        #发货数量
        $count = count($order_list_id);
        #运费设置
        $config = getConfig("base");
        if ($type == 1) { #背包
            $free_post = (int) $config['free_post']; #发货数量
            $free_post = $free_post <= 0 ? 0 : $free_post;
            $post_money = (int) $config['post_money']; #发货运费
            $post_money = $post_money <= 0 ? 0 : $post_money;
        } elseif ($type == 2) { #抽卡机
            $free_post = (int) $config['card_free_post']; #发货数量
            $free_post = $free_post <= 0 ? 0 : $free_post;
            $post_money = (int) $config['card_post_money']; #发货运费
            $post_money = $post_money <= 0 ? 0 : $post_money;
        }
        #发货订单
        $send_num = create_order_no('FH_', 'order_list_send', 'send_num');
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis_key = "kpw_warehouse_send" . '_' . $user['id'];
        $redis_key_info = $redis->get($redis_key);
        if ($redis_key_info) {
            return $this->renderError("当前操作太快了,请等待");
        } else {
            $redis->set($redis_key, 1, 10);
        }
        Db::startTrans();
        #改变赏品信息
        $res[] = OrderList::field('id,send_num')
            ->where('id', 'in', $order_list_id)
            ->where('user_id', '=', $user_id)
            ->where('status', '=', 0)
            ->where('insurance_is', '=', 0)
            ->where('goodslist_type', '=', 1)
            ->update([
                'send_num' => $send_num,
            ]);
        #生成订单
        $res[] = $end_order_id = OrderListSend::insertGetId([
            'user_id' => $user_id,
            'send_num' => $send_num,
            'freight' => $post_money,
            'status' => 0, #0待支付 1待发货 2待收货 3已完成
            'count' => $count,
            'name' => $name,
            'mobile' => $mobile,
            'address' => $address,
            'message' => $message,
            'addtime' => time(),
        ]);
        #为满足发货条件
        //
        // dd($free_post,$count);
        if ($free_post > $count && $post_money > 0) {
            $body = '盒柜发货' . $count . '件';
            $attach = 'order_list_send';
            if ($pay_way == 'ali_wap') {
                $payRes = (new Pay())->zfpay($send_num, $post_money, $body, $attach . ',' . $user['openid']);
            } else {
                $payRes = (new Pay())->wxCreateOrder($send_num, $post_money, $user['openid'], $body, $attach);
            }
            if ($payRes['status'] == 1) {
                #结果集
                $new_data = [
                    'status' => 1,
                    'order_no' => $send_num,
                    'res' => $payRes['data'],
                ];
            } else {
                Db::rollback();
                #删除redis
                $redis->del($redis_key);
                return $this->renderError("下单失败");
            }
        } else {
            OrderListSend::field('freight')->where('id', '=', $end_order_id)->update(['freight' => 0]);
            #背包发货处理
            $res[] = (new Notify($this->app))->reward_order_handle($user['id'], $end_order_id);
            #结果集
            $new_data = [
                'status' => 0,
                'order_no' => $send_num,
            ];
        }
        if (resCheck($res)) {
            Db::commit();
            #删除redis
            $redis->del($redis_key);
            return $this->renderSuccess("发货成功", $new_data);
        } else {
            Db::rollback();
            #删除redis
            $redis->del($redis_key);
            return $this->renderError("发货失败");
        }
    }

    /**
     * 移入保险柜
     */
    public function warehouse_movein()
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $recovery_info = request()->param('recovery_info', '');
        if (empty($recovery_info)) {
            return $this->renderError("请选择兑换的赏品");
        }
        #装换结构
        $recovery_info = json_decode($recovery_info, true);
        $order_list_id = [];
        foreach ($recovery_info as $value) {
            $order_list_ids = OrderList::field('id')
                ->where('user_id', '=', $user_id)
                ->where('status', '=', 0)
                ->where('insurance_is', '=', 0)
                ->where('prize_code', '=', $value['prize_code'])
                ->limit($value['number'])
                ->column("id");
            $order_list_id = array_merge($order_list_id, $order_list_ids);
        }
        if (!$order_list_id) {
            return $this->renderError("请刷新重新选择奖品");
        }
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis_key = "kpw_warehouse_movein" . '_' . $user['id'];
        $redis_key_info = $redis->get($redis_key);
        if ($redis_key_info) {
            return $this->renderError("当前操作太快了,请等待");
        } else {
            $redis->set($redis_key, 1, 10);
        }
        $res = OrderList::field('insurance_is')
            ->where('id', 'in', $order_list_id)
            ->where('user_id', '=', $user_id)
            ->where('status', '=', 0)
            ->where('insurance_is', '=', 0)
            ->update([
                'insurance_is' => 1,
            ]);
        if ($res) {
            #删除redis
            $redis->del($redis_key);
            return $this->renderSuccess("移入成功");
        } else {
            #删除redis
            $redis->del($redis_key);
            return $this->renderError("移入失败");
        }
    }

    /**
     * 移出保险柜
     */
    public function warehouse_remove()
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $recovery_info = request()->param('recovery_info', '');
        if (empty($recovery_info)) {
            return $this->renderError("请选择兑换的赏品");
        }
        #装换结构
        $recovery_info = json_decode($recovery_info, true);
        $order_list_id = [];
        foreach ($recovery_info as $value) {
            $order_list_ids = OrderList::field('id')
                ->where('user_id', '=', $user_id)
                ->where('status', '=', 0)
                ->where('insurance_is', '=', 1)
                ->where('prize_code', '=', $value['prize_code'])
                ->limit($value['number'])
                ->column("id");
            $order_list_id = array_merge($order_list_id, $order_list_ids);
        }
        if (!$order_list_id) {
            return $this->renderError("请刷新重新选择奖品");
        }
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis_key = "kpw_warehouse_remove" . '_' . $user['id'];
        $redis_key_info = $redis->get($redis_key);
        if ($redis_key_info) {
            return $this->renderError("当前操作太快了,请等待");
        } else {
            $redis->set($redis_key, 1, 10);
        }
        $res = OrderList::field('insurance_is')
            ->where('id', 'in', $order_list_id)
            ->where('user_id', '=', $user_id)
            ->where('status', '=', 0)
            ->where('insurance_is', '=', 1)
            ->update([
                'insurance_is' => 0,
            ]);
        if ($res) {
            #删除redis
            $redis->del($redis_key);
            return $this->renderSuccess("移出成功");
        } else {
            #删除redis
            $redis->del($redis_key);
            return $this->renderError("移出失败");
        }
    }


    /**
     * 打包记录
     */
    public function warehouse_recovery_record()
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $data = OrderListRecovery::field('recovery_num,money,count,addtime')
            ->append(['order_list'])
            ->withAttr('addtime', function ($value, $data) {
                return date('Y-m-d H:i:s', $data['addtime']);
            })
            ->where('user_id', '=', $user_id)
            ->order("id desc")
            ->paginate(10);
        $new_data = [
            'data' => $data->items(),
            'last_pahe' => $data->lastPage(),
        ];
        return $this->renderSuccess("请求成功", $new_data);
    }

    /**
     * 发货记录
     */
    public function warehouse_send_record(Request $request)
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $status = \request()->param('status/d', 1);
        if ($status != 1 && $status != 2 && $status != 3) {
            return $this->renderError("非法请求");
        }

        #自动收货=====================================
        $guoqi_time = time() - (7 * 86400);
        OrderListSend::field('status,shou_time')
            ->where('status', '=', 2)
            ->where('send_time', '<=', $guoqi_time)
            ->update(['status' => 3, 'shou_time' => time()]);
        #自动收货=====================================

        $data = OrderListSend::field('id,send_num,status,count,addtime')
            ->append(['order_list', 'status_name'])
            ->withAttr('addtime', function ($value, $data) {
                return date('Y-m-d H:i:s', $data['addtime']);
            })
            ->where('user_id', '=', $user_id)
            ->where('status', '=', $status)
            ->order("id desc")
            ->paginate(10);
        $new_data = [
            'data' => $data->items(),
            'last_pahe' => $data->lastPage(),
        ];
        return $this->renderSuccess("请求成功", $new_data);
    }
    /**
     * 支付的订单
     */
    public function warehouse_prizeorderlog()
    {
        $user = $this->getUser();
        $order_num = request()->param('order_num', '');
        $info = OrderListSend::field('id,status,send_num,name,mobile,address,addtime,pay_time,send_time,shou_time')
        ->where('send_num', '=', $order_num)
        ->where('user_id', '=', $user['id'])
        ->where('status', '=', 1)
        ->find();

        return $this->renderSuccess("请求成功", $info);
    }
    /**
     * 记录详情
     */
    public function warehouse_send_record_detail(Request $request)
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $id = request()->param('id/d', 0);
        if (empty($id)) {
            return $this->renderError("非法请求");
        }
        #发货订单详情
        $info = OrderListSend::field('id,status,send_num,name,mobile,address,addtime,pay_time,send_time,shou_time')
            ->where('id', '=', $id)
            ->where('user_id', '=', $user_id)
            ->find();
        if (!$info) {
            return $this->renderError("请求参数错误");
        }
        if ($info['status'] != 1 && $info['status'] != 2 && $info['status'] != 3) {
            return $this->renderError("请求参数错误1");
        }
        $info['addtime'] = date('Y-m-d H:i:s', $info['addtime']);
        $info['pay_time'] = date('Y-m-d H:i:s', $info['pay_time']);
        $info['send_time'] = $info['send_time'] ? date('Y-m-d H:i:s', $info['send_time']) : '待发货';
        $info['shou_time'] = $info['shou_time'] ? date('Y-m-d H:i:s', $info['shou_time']) : '待收货';
        #奖品
        $data = OrderList::field('goodslist_title,goodslist_imgurl,shang_id,goodslist_money,count(id) as prize_num')
            ->append(['shang_title'])
            ->where(['send_num' => $info['send_num']])
            ->withAttr('goodslist_imgurl', function ($value, $data) {
                return imageUrl($value);
            })
            ->group("prize_code")
            ->select();
        $info['goods'] = $data;
        return $this->renderSuccess("请求成功", $info);
    }

    /**
     * 确认收货
     */
    public function warehouse_send_confirm(Request $request)
    {
        $user = $this->getUser();
        $user_id = $user['id'];
        $id = request()->param('id/d', 0);
        if (empty($id)) {
            return $this->renderError("非法请求");
        }
        #发货订单详情
        $info = OrderListSend::field('id,status')
            ->where('id', '=', $id)
            ->where('user_id', '=', $user_id)
            ->find();
        if (!$info) {
            return $this->renderError("请求参数错误");
        }
        if ($info['status'] == 3) {
            return $this->renderError("请勿重复操作");
        }
        if ($info['status'] != 2) {
            return $this->renderError("该订单暂不能确认收货");
        }
        $res = OrderListSend::where('id', '=', $info['id'])->update(['status' => 3, 'shou_time' => time()]);
        if ($res) {
            return $this->renderSuccess("确认收货成功");
        } else {
            return $this->renderError("网络故障，请稍后重试");
        }
    }

    /**
     * 查看物流
     */
    public function warehouse_order_logistics()
    {
        $status_name = ['快递收件(揽件)', '在途中', '正在派件', '已签收', '派送失败', '疑难件', '退件签收', '其他'];
        $user = $this->getUser();
        $user_id = $user['id'];
        $id = request()->param('id/d', 0);
        if (empty($id)) {
            return $this->renderError("非法请求");
        }
        #发货订单详情
        $info = OrderListSend::field('courier_number,courier_name,courier_code,delivery_list,delivery_status,delivery_time,send_num,count')
            ->where('id', '=', $id)
            ->where('user_id', '=', $user_id)
            ->find();
        if (!$info) {
            return $this->renderError("请求参数错误");
        }
        #奖品图片
        $goodslist_imgurl = OrderList::field('goodslist_imgurl')->where('send_num', '=', $info['send_num'])->value('goodslist_imgurl');
        $info['goodslist_imgurl'] = imageUrl($goodslist_imgurl);
        #物流轨迹
        $delivery_status = isset($status_name[$info['delivery_status']]) ? $status_name[$info['delivery_status']] : '暂无物流轨迹';
        $delivery_list = $info['delivery_list'] ? json_decode($info['delivery_list'], true) : '';
        #查找物流
        if ($info['courier_number'] && (time() > ($info['delivery_time'] + 600))) {
            #顺丰快递
            if ($info['delivery_code'] == 'SFEXPRESS') {
                $m = substr($info['mobile'], -4);
                $info['courier_number'] = $info['courier_number'] . ':' . $m;
            }
            $result = expressWuliu($info['courier_number'], $info['courier_code']);
            if ($result['code'] == 1) {
                #投递状态 0快递收件(揽件)1.在途中 2.正在派件 3.已签收 4.派送失败 5.疑难件 6.退件签收
                $delivery_status = $result['msg']['deliverystatus'];
                $delivery_status = isset($status_name[$delivery_status]) ? $status_name[$delivery_status] : '暂无物流轨迹';
                $delivery_list = $result['msg']['list'];
                OrderListSend::where(['id' => $id])->update([
                    'delivery_list' => $delivery_list ? json_encode($delivery_list) : '',
                    'delivery_time' => time(),
                ]);
            }
        }
        $info['delivery_status'] = $delivery_status;
        $info['delivery_list'] = $delivery_list;
        return $this->renderSuccess("请求成功", $info);
    }
}
